<!DOCTYPE html>
<!-- saved from url=(0041)http://c.biancheng.net/view/vip_7069.html -->
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" async="" charset="utf-8" src="./9.13Java抽象类和接口的联系和区别_files/core.php"></script>

<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面，任何其他内容都*必须*跟随其后！ -->
<!-- 启用Chromium高速渲染模式 -->
<meta name="renderer" content="webkit">
<meta name="force-rendering" content="webkit">
<!-- 禁止百度转码 -->
<meta name="applicable-device" content="pc,mobile">
<meta name="MobileOptimized" content="width">
<meta name="HandheldFriendly" content="true">
<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
<!-- 禁止识别电话号码 -->
<meta name="format-detection" content="telephone=no">

<link rel="shortcut icon" href="http://c.biancheng.net/favicon.ico?v=1.6.72">
<link href="./9.13Java抽象类和接口的联系和区别_files/common.css" rel="stylesheet">
<title>Java抽象类和接口的联系和区别</title>
<meta name="description" content="前面《 Java接口 》一节中提到接口是一种特殊的抽象类，接口和抽象类的渊源颇深，有很大的相似之处，所以在选择使用谁的问题上很容易迷糊。本节我们先整理一下 Java 中抽象类和接">
</head>
<body>
<div id="topbar" class="clearfix">
	<ul id="product-type" class="left">
		<li>
			<a href="http://c.biancheng.net/"><span class="iconfont iconfont-home"></span>首页</a>
		</li>
		<li class="active">
			<a href="http://c.biancheng.net/sitemap/" rel="nofollow"><span class="iconfont iconfont-book"></span>教程</a>
		</li>
		<li>
			<a href="http://vip.biancheng.net/p/vip/show.php" rel="nofollow" target="_blank"><span class="iconfont iconfont-vip"></span>VIP会员</a>
		</li>
		<li>
			<a href="http://vip.biancheng.net/p/q2a/show.php" rel="nofollow" target="_blank"><span class="iconfont iconfont-q2a"></span>一对一答疑</a>
		</li>
		<li>
			<a href="http://fudao.biancheng.net/" rel="nofollow" target="_blank"><span class="iconfont iconfont-fudao"></span>辅导班</a>
		</li>
	</ul>
</div>
<div id="header" class="clearfix">
	<a id="logo" class="left" href="http://c.biancheng.net/">
		<img height="26" src="./9.13Java抽象类和接口的联系和区别_files/logo.png" alt="C语言中文网">
	</a>
	<ul id="nav-main" class="hover-none left clearfix">
		<li class="wap-yes"><a href="http://c.biancheng.net/">首页</a></li>
		<li><a href="http://c.biancheng.net/c/">C语言教程</a></li>
		<li><a href="http://c.biancheng.net/cplus/">C++教程</a></li>
		<li><a href="http://c.biancheng.net/python/">Python教程</a></li>
		<li><a href="http://c.biancheng.net/java/">Java教程</a></li>
		<li><a href="http://c.biancheng.net/linux_tutorial/">Linux入门</a></li>
		<li><a href="http://c.biancheng.net/sitemap/" title="网站地图">更多&gt;&gt;</a></li>
	</ul>
	<span id="sidebar-toggle" class="toggle-btn" toggle-target="#sidebar">目录 <span class="glyphicon"></span></span>

	<a href="http://vip.biancheng.net/?from=topbar" class="user-info glyphicon glyphicon-user hover-none" target="_blank" rel="nofollow" title="用户中心"></a>
</div>
<div id="main" class="clearfix">
	<div id="sidebar" class="toggle-target">
	<div id="contents">
		<dt><span class="glyphicon glyphicon-option-vertical" aria-hidden="true"></span><a href="http://c.biancheng.net/java/">Java教程</a></dt>
		
			<dd>
				<span class="channel-num">1</span>
				<a href="http://c.biancheng.net/java/10/">Java入门基础及环境搭建</a>
			</dd>
		
			<dd>
				<span class="channel-num">2</span>
				<a href="http://c.biancheng.net/java/20/">Java程序设计基础</a>
			</dd>
		
			<dd>
				<span class="channel-num">3</span>
				<a href="http://c.biancheng.net/java/30/">Java流程控制语句</a>
			</dd>
		
			<dd>
				<span class="channel-num">4</span>
				<a href="http://c.biancheng.net/java/40/">Java字符串处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">5</span>
				<a href="http://c.biancheng.net/java/50/">Java数字和日期处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">6</span>
				<a href="http://c.biancheng.net/java/60/">Java内置包装类</a>
			</dd>
		
			<dd>
				<span class="channel-num">7</span>
				<a href="http://c.biancheng.net/java/70/">Java数组处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">8</span>
				<a href="http://c.biancheng.net/java/80/">Java类和对象</a>
			</dd>
		<dd class="this"> <span class="channel-num">9</span> <a href="http://c.biancheng.net/java/90/">Java继承和多态</a> </dd><dl class="dl-sub"><dd>9.1 <a href="http://c.biancheng.net/view/986.html">Java类的封装</a></dd><dd>9.2 <a href="http://c.biancheng.net/view/987.html">Java封装图书信息类</a></dd><dd>9.3 <a href="http://c.biancheng.net/view/6398.html">Java继承简明教程</a></dd><dd>9.4 <a href="http://c.biancheng.net/view/6394.html">Java super关键字</a></dd><dd>9.5 <a href="http://c.biancheng.net/view/6503.html">Java对象类型转换</a></dd><dd>9.6 <a href="http://c.biancheng.net/view/vip_7067.html">Java中为什么使用向上转型而不直接创建子类对象？</a><span class="glyphicon glyphicon-usd"></span></dd><dd>9.7 <a href="http://c.biancheng.net/view/998.html">Java方法重载</a></dd><dd>9.8 <a href="http://c.biancheng.net/view/1000.html">Java方法重写</a></dd><dd>9.9 <a href="http://c.biancheng.net/view/1001.html">Java多态性</a></dd><dd>9.10 <a href="http://c.biancheng.net/view/6346.html">Java instanceof关键字</a></dd><dd>9.11 <a href="http://c.biancheng.net/view/1004.html">Java抽象类</a></dd><dd>9.12 <a href="http://c.biancheng.net/view/6540.html">Java接口</a></dd><dd class="active">9.13 <a href="http://c.biancheng.net/view/vip_7069.html">Java抽象类和接口的联系和区别</a><span class="glyphicon glyphicon-usd"></span></dd><dd>9.14 <a href="http://c.biancheng.net/view/1022.html">Java内部类简介</a></dd><dd>9.15 <a href="http://c.biancheng.net/view/1025.html">Java实例内部类</a></dd><dd>9.16 <a href="http://c.biancheng.net/view/1026.html">Java静态内部类</a></dd><dd>9.17 <a href="http://c.biancheng.net/view/1028.html">Java局部内部类</a></dd><dd>9.18 <a href="http://c.biancheng.net/view/1031.html">Java匿名类</a></dd><dd>9.19 <a href="http://c.biancheng.net/view/vip_7070.html">Java使用内部类实现多重继承</a><span class="glyphicon glyphicon-usd"></span></dd><dd>9.20 <a href="http://c.biancheng.net/view/6564.html">Java8新特性：Effectively final</a></dd><dd>9.21 <a href="http://c.biancheng.net/view/6393.html">Java Lambda表达式</a></dd><dd>9.22 <a href="http://c.biancheng.net/view/vip_7071.html">Java Lambda表达式的3种简写方式</a><span class="glyphicon glyphicon-usd"></span></dd><dd>9.23 <a href="http://c.biancheng.net/view/6466.html">Java Lambda表达式的使用</a></dd><dd>9.24 <a href="http://c.biancheng.net/view/vip_7072.html">Java Lambda表达式与匿名内部类的联系和区别</a><span class="glyphicon glyphicon-usd"></span></dd></dl>
			<dd>
				<span class="channel-num">10</span>
				<a href="http://c.biancheng.net/java/100/">Java异常处理</a>
			</dd>
		
			<dd>
				<span class="channel-num">11</span>
				<a href="http://c.biancheng.net/java/110/">Java集合、泛型和枚举</a>
			</dd>
		
			<dd>
				<span class="channel-num">12</span>
				<a href="http://c.biancheng.net/java/120/">Java反射机制</a>
			</dd>
		
			<dd>
				<span class="channel-num">13</span>
				<a href="http://c.biancheng.net/java/130/">Java输入/输出流</a>
			</dd>
		
			<dd>
				<span class="channel-num">14</span>
				<a href="http://c.biancheng.net/java/java/135/">Java注解</a>
			</dd>
		
	</div>
</div>
	<div id="article-wrap">
		<div id="article">
			<div class="arc-info">
	<span class="position"><span class="glyphicon glyphicon-map-marker"></span> <a href="http://c.biancheng.net/">首页</a> &gt; <a href="http://c.biancheng.net/java/">Java教程</a> &gt; <a href="http://c.biancheng.net/java/90/">Java继承和多态</a></span>
	<span class="read-num">阅读：6,617</span>
</div>

<div id="ad-position-bottom"></div>
			<h1>Java抽象类和接口的联系和区别</h1>
			<div class="pre-next-page clearfix">
                    <span class="pre left"><span class="icon">&lt;</span> <span class="text-brief text-brief-pre">上一页</span><a href="http://c.biancheng.net/view/6540.html">Java接口</a></span>
                    <span class="next right"><a href="http://c.biancheng.net/view/1022.html">Java内部类简介</a><span class="text-brief text-brief-next">下一页</span> <span class="icon">&gt;</span></span>
                </div>
			<div id="ad-arc-top"><p class="pic"></p><p class="text" adid="java-1v1q2a"><a href="http://c.biancheng.net/view/7552.html" target="_blank" style="color: #D33428;">C语言中文网推出辅导班啦，包括<span style="color: #008000;">「C语言辅导班、C++辅导班、算法/数据结构辅导班」</span>，全部都是一对一教学：一对一辅导 + 一对一答疑 + 布置作业 + 项目实践 + 永久学习。QQ在线，随时响应！</a></p></div>
			<div id="arc-body">前面《<a href="http://c.biancheng.net/view/6540.html" target="_blank">Java接口</a>》一节中提到接口是一种特殊的抽象类，接口和抽象类的渊源颇深，有很大的相似之处，所以在选择使用谁的问题上很容易迷糊。本节我们先整理一下 Java 中抽象类和接口的特点，再分析它们具有的相同点、不同点和使用场景。<br>
<h4>
	1）抽象类</h4>
在 Java 中，被关键字 abstract 修饰的类称为抽象类；被 abstract 修饰的方法称为抽象方法，抽象方法只有方法声明没有方法体。<br>
<br>
抽象类有以下几个特点：
<ol>
	<li>
		抽象类不能被实例化，只能被继承。</li>
	<li>
		包含抽象方法的类一定是抽象类，但抽象类不一定包含抽象方法（抽象类可以包含普通方法）。</li>
	<li>
		抽象方法的权限修饰符只能为 public、protected 或 default，默认情况下为 public。</li>
	<li>
		一个类继承于一个抽象类，则子类必须实现抽象类的抽象方法，如果子类没有实现父类的抽象方法，那子类必须定义为抽象类。</li>
	<li>
		抽象类可以包含属性、方法、构造方法，但构造方法不能用来实例化对象，只能被子类调用。</li>
</ol>
<h4>
	2）接口</h4>
接口可以看成是一种特殊的类，只能用 interface 关键字修饰。<br>
<br>
Java 中的接口具有以下几个特点：
<ol>
	<li>
		接口中可以包含变量和方法，变量被隐式指定为 public static final，方法被隐式指定为 public abstract（JDK 1.8 之前）。</li>
	<li>
		接口支持多继承，即一个接口可以继承（extends）多个接口，间接解决了 Java 中类不能多继承的问题。</li>
	<li>
		一个类可以同时实现多个接口，一个类实现某个接口则必须实现该接口中的抽象方法，否则该类必须被定义为抽象类。</li>
</ol>
<h4>
	3）抽象类和接口的区别</h4>
接口和抽象类很像，它们都具有如下特征。
<ul>
	<li>
		接口和抽象类都不能被实例化，主要用于被其他类实现和继承。</li>
	<li>
		接口和抽象类都可以包含抽象方法，实现接口或继承抽象类的普通子类都必须实现这些抽象方法。</li>
</ul>
<br>
但接口和抽象类之间的差别非常大，这种差别主要体现在二者设计目的上。下面具体分析二者的差别。<br>
<br>
接口作为系统与外界交互的窗口，接口体现的是一种规范。对于接口的实现者而言，接口规定了实现者必须向外提供哪些服务（以方法的形式来提供）；对于接口的调用者而言，接口规定了调用者可以调用哪些服务，以及如何调用这些服务（就是如何来调用方法）。当在一个程序中使用接口时，接口是多个模块间的耦合标准；当在多个应用程序之间使用接口时，接口是多个程序之间的通信标准。<br>
<br>
从某种程度上来看，接口类似于整个系统的“总纲”，它制定了系统各模块应该遵循的标准，因此一个系统中的接口不应该经常改变。一旦接口被改变，对整个系统甚至其他系统的影响将是辐射式的，会导致系统中大部分类都需要改写。<br>
<br>
抽象类则不一样，抽象类作为系统中多个子类的共同父类，它所体现的是一种模板式设计。抽象类作为多个子类的抽象父类，可以被当成系统实现过程中的中间产品，这个中间产品已经实现了系统的部分功能（那些已经提供实现的方法），但这个产品依然不能当成最终产品，必须有更进一步的完善，这种完善可能有几种不同方式。<br>
<br>
除此之外，接口和抽象类在用法上也存在差别，如下表所示：<br>
<br>
<table>
	<tbody>
		<tr>
			<th>
				参数</th>
			<th>
				抽象类</th>
			<th>
				接口</th>
		</tr>
		<tr>
			<td>
				实现</td>
			<td>
				子类使用 extends 关键字来继承抽象类，如果子类不是抽象类，则需要提供抽象类中所有声明的方法的实现。</td>
			<td>
				子类使用 implements 关键字来实现接口，需要提供接口中所有声明的方法的实现。</td>
		</tr>
		<tr>
			<td>
				访问修饰符</td>
			<td>
				可以用 public、protected 和 default 修饰</td>
			<td>
				默认修饰符是 public，不能使用其它修饰符</td>
		</tr>
		<tr>
			<td>
				方法</td>
			<td>
				完全可以包含普通方法</td>
			<td>
				只能包含抽象方法、静态方法、默认方法和私有方法，不能为普通方法提供方法实现</td>
		</tr>
		<tr>
			<td>
				变量</td>
			<td>
				既可以定义普通成员变量，也可以定义静态常量</td>
			<td>
				只能定义静态常量，不能定义普通成员变量</td>
		</tr>
		<tr>
			<td>
				构造方法</td>
			<td>
				抽象类里的构造方法并不是用于创建对象，而是让其子类调用这些构造方法来完成属于抽象类的初始化操作</td>
			<td>
				没有构造方法</td>
		</tr>
		<tr>
			<td>
				初始化块</td>
			<td>
				可以包含初始化块</td>
			<td>
				不能包含初始化块</td>
		</tr>
		<tr>
			<td>
				main 方法</td>
			<td>
				可以有 main 方法，并且能运行</td>
			<td>
				没有 main 方法</td>
		</tr>
		<tr>
			<td>
				与普通Java类的区别</td>
			<td>
				抽象类不能实例化，除此之外和普通 Java 类没有任何区别</td>
			<td>
				是完全不同的类型</td>
		</tr>
		<tr>
			<td>
				运行速度</td>
			<td>
				比接口运行速度要快</td>
			<td>
				需要时间去寻找在类种实现的方法，所以运行速度稍微有点慢</td>
		</tr>
	</tbody>
</table>
<br>
一个类最多只能有一个直接父类，包括抽象类，但一个类可以直接实现多个接口，通过实现多个接口可以弥补 Java 单继承的不足。
<h4>
	4）抽象类和接口的应用场景</h4>
抽象类的应用场景：
<ol>
	<li>
		父类只知道其子类应该包含怎样的方法，不能准确知道这些子类如何实现这些方法的情况下，使用抽象类。</li>
	<li>
		从多个具有相同特征的类中抽象出一个抽象类，以这个抽象类作为子类的模板，从而避免了子类设计的随意性。</li>
</ol>
<br>
接口的应用场景：
<ol>
	<li>
		一般情况下，实现类和它的抽象类之前具有 "is-a" 的关系，但是如果我们想达到同样的目的，但是又不存在这种关系时，使用接口。</li>
	<li>
		由于 Java 中单继承的特性，导致一个类只能继承一个类，但是可以实现一个或多个接口，此时可以使用接口。</li>
</ol>
<br>
什么时候使用抽象类和接口：
<ul>
	<li>
		如果拥有一些方法并且想让它们有默认实现，则使用抽象类。</li>
	<li>
		如果想实现多重继承，那么必须使用接口。因为&nbsp;Java 不支持多继承，子类不能继承多个类，但可以实现多个接口，因此可以使用接口。</li>
	<li>
		如果基本功能在不断改变，那么就需要使用抽象类。如果使用接口并不断需要改变基本功能，那么就需要改变所有实现了该接口的类。</li>
</ul>
</div>
			<div id="arc-append">
	<p>关注微信公众号「站长严长生」，在手机上阅读所有教程，随时随地都能学习。本公众号由<a class="col-link" href="http://c.biancheng.net/view/8092.html" target="_blank" rel="nofollow">C语言中文网站长</a>运营，每日更新，坚持原创，敢说真话，凡事有态度。</p>
	<p style="margin-top:12px; text-align:center;">
		<img width="180" src="./9.13Java抽象类和接口的联系和区别_files/qrcode_weixueyuan_original.png" alt="魏雪原二维码"><br>
		<span class="col-green">微信扫描二维码关注公众号</span>
	</p>
</div>
<!-- <p>关注微信公众号「魏雪原」，跟着<a class="col-link" href="/view/8092.html" target="_blank">站长</a>一起学习，拒绝躺平，跳出内卷，用知识完成阶级跃升：</p>
	<ul>
		<li>每日更新，坚持原创，敢说真话，凡事有态度。</li>
		<li>编程+求职+创业+营销，既有硬知识，也有软技能。</li>
		<li>手机端阅读教程，随时随地都能学习。</li>
		<li>即将绑定网站部分功能，包括注册登录、找回密码、获取下载链接等。</li>
	</ul> -->
			<div class="pre-next-page clearfix">
                    <span class="pre left"><span class="icon">&lt;</span> <span class="text-brief text-brief-pre">上一页</span><a href="http://c.biancheng.net/view/6540.html">Java接口</a></span>
                    <span class="next right"><a href="http://c.biancheng.net/view/1022.html">Java内部类简介</a><span class="text-brief text-brief-next">下一页</span> <span class="icon">&gt;</span></span>
                </div>
			<div id="ad-arc-bottom"></div>

<!-- <div id="ad-bottom-weixin" class="clearfix">
	<div class="left" style="width: 535px;">
		<p><span class="col-red">编程帮</span>，一个分享编程知识的公众号。跟着<a class="col-link" href="/cpp/about/author/" target="_blank">站长</a>一起学习，每天都有进步。</p>
		<p>通俗易懂，深入浅出，一篇文章只讲一个知识点。</p>
		<p>文章不深奥，不需要钻研，在公交、在地铁、在厕所都可以阅读，随时随地涨姿势。</p>
		<p>文章不涉及代码，不烧脑细胞，人人都可以学习。</p>
		<p>当你决定关注「编程帮」，你已然超越了90%的程序员！</p>
	</div>
	<div class="right" style="width: 150px;">
		<img width="150" src="/templets/new/images/erweima_biancheng.gif?v=1.6.72" alt="编程帮二维码" /><br />
		<span class="col-green">微信扫描二维码关注</span>
	</div>
</div> -->

<div id="nice-arcs" class="box-bottom">
	<h4>优秀文章</h4>
	<ul class="clearfix">
<li><a href="http://c.biancheng.net/view/1779.html" title="同飞教育Java SE入门视频教程（付强主讲）">同飞教育Java SE入门视频教程（付强主讲）</a></li>
<li><a href="http://c.biancheng.net/view/2160.html" title="C++学生信息管理系统演示和说明（文件版）">C++学生信息管理系统演示和说明（文件版）</a></li>
<li><a href="http://c.biancheng.net/view/2895.html" title="C# Stack类：堆栈">C# Stack类：堆栈</a></li>
<li><a href="http://c.biancheng.net/view/4227.html" title="Python字符串详解（包含长字符串和原始字符串）">Python字符串详解（包含长字符串和原始字符串）</a></li>
<li><a href="http://c.biancheng.net/view/5031.html" title="Struts2 ActionSupport类：业务控制器">Struts2 ActionSupport类：业务控制器</a></li>
<li><a href="http://c.biancheng.net/view/5086.html" title="Struts2 “#”符号：获取集合中的数据并进行选择操作">Struts2 “#”符号：获取集合中的数据并进行选择操作</a></li>
<li><a href="http://c.biancheng.net/view/5148.html" title="Hibernate id方法：投影对象标识符">Hibernate id方法：投影对象标识符</a></li>
<li><a href="http://c.biancheng.net/view/8529.html" title="VS2019下载地址和安装教程（图解）">VS2019下载地址和安装教程（图解）</a></li>
<li><a href="http://c.biancheng.net/mongodb2/objectid.html" title="MongoDB ObjectId">MongoDB ObjectId</a></li>
<li><a href="http://c.biancheng.net/view/9450.html" title="使用CLion编写C语言程序">使用CLion编写C语言程序</a></li>
</ul>
</div>
		</div>
		
	</div>
</div>
<script type="text/javascript">
// 当前文章ID
window.arcIdRaw = 'a_' + 7069;
window.arcId = "4139wdBKv06ug+65TraJRVnuk3gevL6zCfV6gAVk37NVRdTOICikzWAE8r4";
window.typeidChain = "100|79";
</script>
<div id="footer" class="clearfix">
	<div class="info left">
	<p>精美而实用的网站，分享优质编程教程，帮助有志青年。千锤百炼，只为大作；精益求精，处处斟酌；这种教程，看一眼就倾心。</p>
	<p>
		<a href="http://c.biancheng.net/view/8066.html" target="_blank" rel="nofollow">关于网站</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8092.html" target="_blank" rel="nofollow">关于站长</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8097.html" target="_blank" rel="nofollow">如何完成一部教程</a> <span>|</span>
		<a href="http://c.biancheng.net/view/8093.html" target="_blank" rel="nofollow">联系我们</a> <span>|</span>
		<a href="http://c.biancheng.net/sitemap/" target="_blank" rel="nofollow">网站地图</a>
	</p>
	<p>Copyright ©2012-2021 biancheng.net, <a href="http://www.beian.miit.gov.cn/" target="_blank" rel="nofollow" style="color:#666;">陕ICP备15000209号</a></p>
	</div>
	<img class="right" src="./9.13Java抽象类和接口的联系和区别_files/logo_bottom.gif" alt="底部Logo">
	<span id="return-top"><b>↑</b></span>
</div>

<script type="text/javascript">
window.siteId = 4;
window.cmsTemplets = "/templets/new";
window.cmsTempletsVer = "1.6.72";
</script>

<script src="./9.13Java抽象类和接口的联系和区别_files/jquery1.12.4.min.js.下载"></script>
<script src="./9.13Java抽象类和接口的联系和区别_files/common.js.下载"></script>
<span style="display:none;"><script src="./9.13Java抽象类和接口的联系和区别_files/z_stat.php" type="text/javascript" defer="defer" async="async"></script></span>

</body></html>